-- appear_do_summon
-- Created by chengb Dec/23/2015
-- 出场时召唤元素

-- 角斗台中召唤元素的位置
local ARENA_SUMMON_POS = 29;

-- 格子是否可以召唤
local canGridSummon = function(grid, block)
    -- 未被翻开
    if not grid:isOpened() then
        return false;
    end

    -- 有奖励
    if grid.bonus then
        -- 此种情况必定不能选
        if grid.state ~= GRID_STATE_DISABLE then
            return false;
        end

        -- 如果原先是怪物则也不能选
        if grid.monster then
            return false;
        end
    end

    -- 有钥匙
    if grid.has_key then
        return false;
    end

    -- 空格或者失效的格子
    if grid.type == GRID_TYPE_EMPTY or
        grid.state == GRID_STATE_DISABLE then
        return true;
    end

    local invisibleBlockClass = DungeonM.getInvisibleBlockClass();
    if block and grid.class == invisibleBlockClass then
        -- 允许是隐形障碍格
        return true;
    end

    return false;
end

return {
    apply = function(prop, baseValue)
        -- 提升的值
        return prop[3];
    end,

    -- 进入角斗台/活动BOSS层时触发
    trigger = function(who, prop)
        local element = tonumber(prop[2]);

        local arr = {};

        -- 如果在角斗台中，刷在固定位置
        if ArenaM.isInArena() then
            local pos = ARENA_SUMMON_POS;
            DungeonM.transGridToMonster(pos, element);
            return { who };
        end

        -- 如果在活动BOSS层(西洋棋冈布奥/黑白皇后)
        if ActivityDungeonM.isInActivityBossLayer()
            and who:isBoss() then
            -- 需要看看这个怪物能不能召唤
            if not FormulaM.invoke("CALC_CAN_CALL_MONSTER", who, element) then
                return {};
            end

            -- 活动对应boss的召唤位置
            local bossId = who:getClassId();
            local dbase = ActivityBossM.queryBoss(bossId, "dbase");
            arr = dbase["summon_pos"] or {};

            local finalArr = {};
            for index = #arr, 1, -1 do
                local pos = arr[index] + 1;    -- 客户端下标比服务器多1
                local grid = DungeonM.getGridByPos(pos);
                if canGridSummon(grid, true) then
                    table.insert(finalArr, pos);
                end
            end
            table.sort(finalArr);
            arr = finalArr;
        else
            -- 找出所有已使用的空位
            for pos = 1, GRID_SIZE do
                local grid = DungeonM.getGridByPos(pos);
                if canGridSummon(grid) then
                    table.insert(arr, grid:getPos());
                end
            end
        end

        -- 如果没有空位
        if #arr <= 0 then
            return {};
        end

        local rand = DungeonM.getRandSeed("appear_do_summon");

        local pos = arr[rand % #arr + 1];

        -- 如果是西洋棋召唤的，先记录一下位置
        if ActivityDungeonM.isInActivityBossLayer()
            and who:isBoss() then
            local appearSummon = ME.user.chessBossAppearSummon or {};
            table.insert(appearSummon, pos);
            table.sort(appearSummon);
            ME.user.chessBossAppearSummon = appearSummon;
        end

        -- 召唤一个怪物
        DungeonM.transGridToMonster(pos, element);

        return { who };
    end,

    record = function(target, prop, path)
        return false;
    end
};